﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SIGCBI.Entities;
using System.Data;
using System.Data.Entity;
using System.Data.Objects;

namespace SIGCBI.Repository
{
    public interface IPartidaRepository
    {
        List<PARTIDA> GetAllFromPartidas();
        List<PARTIDA> GetFromPartidasByNombre(string nombre);
        PARTIDA ValidarDuplicidadPartida(string codigo, int id);
        PARTIDA GetFromPartidaById(Int32 id);
        void AddPartida(PARTIDA partida);
        void UpdatePartida(PARTIDA partida);

        DETALLE_PARTIDA GetFromDetallePartidaByIdAreaAndIdPartida(Int32 idArea, Int32 IdPartida);
        void AddDetallePartida(DETALLE_PARTIDA detallePartida);

        void AddCambioPartida(CAMBIO_PARTIDAS cambioPartida);
        CAMBIO_PARTIDAS GetFromResolucion(Int32 idCambioPartida);

        List<DETALLE_PARTIDA> GetFromDetallePartidaByIdFuente(Int32 idFuente);

        void AddReducirPartida(REDUCIR_PRESUPUESTO reducirPartida);

        List<REDUCIR_PRESUPUESTO> GetAllGastosFromReducirPresupuestoByIdPartida(Int32 IdPartida);
    }

    public class PartidaRepository : MasterDataAccess , IPartidaRepository
    {
        public List<PARTIDA> GetAllFromPartidas()
        {
            var query = from c in Context.PARTIDAs.Include("REDUCIR_PRESUPUESTO")
                        select c;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.ToList();
        }

        public List<PARTIDA> GetFromPartidasByNombre(string nombre)
        {
            if (nombre != "")
            {
                var query = from c in Context.PARTIDAs.Include("REDUCIR_PRESUPUESTO")
                            where c.Codigo.ToUpper().Contains(nombre.ToUpper()) ||
                            c.Nombre.ToUpper().Contains(nombre.ToUpper()) 
                            select c;

                ObjectContext.Refresh(RefreshMode.StoreWins, query);

                return query.ToList();
            }
            else
            {
                var query1 = from c in Context.PARTIDAs.Include("REDUCIR_PRESUPUESTO")
                             select c;

                ObjectContext.Refresh(RefreshMode.StoreWins, query1);

                return query1.ToList();
            }
        }

        public PARTIDA GetFromPartidaById(int id)
        {
            var query = from p in Context.PARTIDAs.Include("DETALLE_PARTIDA.FUENTE_FINANCIERA")
                        where p.Id.Equals(id)
                        select p;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.SingleOrDefault();    
        }

        public void AddPartida(PARTIDA partida)
        {
            Context.PARTIDAs.Add(partida);
            Context.SaveChanges();
        }

        public void UpdatePartida(Entities.PARTIDA partida)
        {
            partida.DETALLE_PARTIDA = null;
            Context.PARTIDAs.Attach(partida);
            Context.Entry(partida).State = EntityState.Modified;
            Context.SaveChanges();
        }

        public PARTIDA ValidarDuplicidadPartida(string codigo, int id)
        {
            var query = from c in Context.PARTIDAs
                        where (c.Codigo.ToUpper().CompareTo(codigo.ToUpper()) == 0)
                        && c.Id != id
                        select c;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.FirstOrDefault();
        }


        public DETALLE_PARTIDA GetFromDetallePartidaByIdAreaAndIdPartida(int idArea, int IdPartida)
        {
            var query = from p in Context.DETALLE_PARTIDA.Include("FUENTE_FINANCIERA")
                        where p.IdFuenteFinanciera.Equals(idArea) && p.IdPartida.Equals(IdPartida)
                        select p;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.SingleOrDefault();
        }


        public void AddDetallePartida(DETALLE_PARTIDA detallePartida)
        {
            Context.DETALLE_PARTIDA.Add(detallePartida);
            Context.SaveChanges();
        }




        public void AddCambioPartida(CAMBIO_PARTIDAS cambioPartida)
        {
            Context.CAMBIO_PARTIDAS.Add(cambioPartida);
            Context.SaveChanges();
        }


        public CAMBIO_PARTIDAS GetFromResolucion(int idCambioPartida)
        {
            var query = from p in Context.CAMBIO_PARTIDAS.Include("RESOLUCION")
                        where p.Id.Equals(idCambioPartida)
                        select p;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.SingleOrDefault();    
        }


        public List<DETALLE_PARTIDA> GetFromDetallePartidaByIdFuente(int idFuente)
        {
            var query = from c in Context.DETALLE_PARTIDA.Include("PARTIDA")
                        where c.IdFuenteFinanciera.Equals(idFuente)
                        select c;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.ToList();
        }


        public void AddReducirPartida(REDUCIR_PRESUPUESTO reducirPartida)
        {
            Context.REDUCIR_PRESUPUESTOs.Add(reducirPartida);
            Context.SaveChanges();
        }


        public List<REDUCIR_PRESUPUESTO> GetAllGastosFromReducirPresupuestoByIdPartida(int IdPartida)
        {
            var query = from p in Context.REDUCIR_PRESUPUESTOs.Include("PARTIDA")
                        where p.IdPartida.Equals(IdPartida)
                        select p;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.ToList();
        }
    }
}
